import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class PatientInputScreen extends StatefulWidget {
  @override
  _PatientInputScreenState createState() => _PatientInputScreenState();
}

class _PatientInputScreenState extends State<PatientInputScreen> {
  final _formKey = GlobalKey<FormState>();
  final TextEditingController _districtController = TextEditingController();
  final TextEditingController _ageController = TextEditingController();
  String _gender = 'Мужской';
  final Map<String, String> _toothForm = {};

  final List<String> districts = [
    'Рязанский',
    'Скопинский',
    'Александро-Невский',
    'Ермишинский',
    'Захаровский',
    'Кадомский',
    'Касимовский',
    'Клепиковский',
    'Кораблинский',
    'Милославский',
    'Михайловский',
    'Пителинский',
    'Пронский',
    'Путятинский',
    'Рыбновский',
    'Ряжский',
    'Сапожковский',
    'Сараевский',
    'Сасовский',
    'Спасский',
    'Старожиловский',
    'Ухоловский',
    'Чучковский',
    'Шацкий',
    'Шиловский район',
  ];

  List<TableRow> _buildToothRows() {
    List<TableRow> rows = [];

    rows.add(TableRow(
      children: List.generate(16, (index) {
        String toothNumber = index < 8 ? '1.${8 - index}' : '2.${index - 7}';
        return _buildToothCell(toothNumber);
      }),
    ));

    rows.add(TableRow(
      children: List.generate(16, (index) {
        return SizedBox(height: 10);
      }),
    ));

    rows.add(TableRow(
      children: List.generate(16, (index) {
        String toothNumber = index < 8 ? '4.${8 - index}' : '3.${index - 7}';
        return _buildToothCell(toothNumber);
      }),
    ));

    return rows;
  }

  Widget _buildToothCell(String toothNumber) {
    return GestureDetector(
      onTap: () {
        _showConditionDialog(toothNumber);
      },
      child: Container(
        padding: EdgeInsets.all(8.0),
        decoration: BoxDecoration(
          border: Border.all(color: Colors.black),
          color: _getToothColor(_toothForm[toothNumber]),
        ),
        child: Column(
          children: <Widget>[
            Text(toothNumber),
            Text(_toothForm[toothNumber] ?? ''),
          ],
        ),
      ),
    );
  }

  Color _getToothColor(String? condition) {
    switch (condition) {
      case 'Кариес':
        return Colors.red;
      case 'Запломбирован':
        return Colors.green;
      case 'Удален':
        return Colors.grey;
      default:
        return Colors.white;
    }
  }

  void _showConditionDialog(String toothNumber) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        String condition = _toothForm[toothNumber] ?? '';
        return AlertDialog(
          title: Text('Укажите состояние зуба $toothNumber'),
          content: DropdownButtonFormField<String>(
            value: condition.isNotEmpty ? condition : null,
            items: ['Кариес', 'Запломбирован', 'Удален'].map((String value) {
              return DropdownMenuItem<String>(
                value: value,
                child: Text(value),
              );
            }).toList(),
            onChanged: (newValue) {
              setState(() {
                _toothForm[toothNumber] = newValue!;
              });
              Navigator.of(context).pop();
            },
            validator: (value) {
              if (value == null || value.isEmpty) {
                return 'Пожалуйста, выберите состояние зуба';
              }
              return null;
            },
          ),
        );
      },
    );
  }

  void _submitForm() async {
    if (_formKey.currentState!.validate()) {
      final patientData = {
        'district': _districtController.text,
        'age': int.parse(_ageController.text),
        'gender': _gender,
        'tooth_conditions': _toothForm,
        'kp_index': _calculateKpIndex(),
      };

      try {
        final response = await http.post(
          Uri.parse('http://5.23.53.132:5000/add_patient_data'),
          headers: {'Content-Type': 'application/json'},
          body: jsonEncode(patientData),
        );

        if (response.statusCode == 201) {
          setState(() {
            _districtController.clear();
            _ageController.clear();
            _gender = 'Мужской';
            _toothForm.clear();
          });
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Данные отправлены!'), backgroundColor: Colors.green),
          );
        } else {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Ошибка отправки данных'), backgroundColor: Colors.red),
          );
        }
      } catch (e) {
        print('Error: $e');
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Ошибка соединения с сервером'), backgroundColor: Colors.red),
        );
      }
    }
  }

  double _calculateKpIndex() {
    int k = 0, p = 0, u = 0;

    _toothForm.forEach((key, value) {
      if (value == 'Кариес') k++;
      if (value == 'Запломбирован') p++;
      if (value == 'Удален') u++;
    });

    return (k + p + u).toDouble();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ввод данных пациента'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: SingleChildScrollView(
            child: Column(
              children: <Widget>[
                DropdownButtonFormField<String>(
                  value: _districtController.text,
                  decoration: InputDecoration(labelText: 'Район'),
                  items: districts.map((String district) {
                    return DropdownMenuItem<String>(
                      value: district,
                      child: Text(district),
                    );
                  }).toList(),
                  onChanged: (newValue) {
                    setState(() {
                      _districtController.text = newValue!;
                    });
                  },
                  validator: (value) {
                    if (value == null || value.isEmpty) {
                      return 'Пожалуйста, выберите район';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  controller: _ageController,
                  decoration: InputDecoration(labelText: 'Возраст'),
                  keyboardType: TextInputType.number,
                  validator: (value) {
                    if (value == null || value.isEmpty) {
                      return 'Пожалуйста, введите возраст';
                    }
                    return null;
                  },
                ),
                DropdownButtonFormField<String>(
                  value: _gender,
                  decoration: InputDecoration(labelText: 'Пол'),
                  items: ['Мужской', 'Женский'].map((String value) {
                    return DropdownMenuItem<String>(
                      value: value,
                      child: Text(value),
                    );
                  }).toList(),
                  onChanged: (newValue) {
                    setState(() {
                      _gender = newValue!;
                    });
                  },
                ),
                SizedBox(height: 20),
                Text('Состояние зубов'),
                Table(
                  border: TableBorder.all(),
                  children: _buildToothRows(),
                ),
                SizedBox(height: 20),
                Text('Индекс КПУ: ${_calculateKpIndex()}'),
                SizedBox(height: 20),
                ElevatedButton(
                  onPressed: _submitForm,
                  child: Text('Отправить'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
